package com.acol.estagio.workflow.struts.action;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.actions.DispatchAction;

import com.acol.estagio.workflow.services.util.EstagioServices;
import com.acol.estagio.workflow.struts.form.GerenciarTimesForm;
import com.acol.estagio.workflow.struts.form.MostrarTimeCampeonatoMenuForm;
import com.acol.estagio.workflow.vo.CampeonatoVO;
import com.acol.estagio.workflow.vo.ContaVO;
import com.acol.estagio.workflow.vo.JogosVO;
import com.acol.estagio.workflow.vo.TimesVO;

public class MostrarTimeCampeonatoMenuAction extends DispatchAction{
	private ContaVO contaVO = new ContaVO();
	public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		MostrarTimeCampeonatoMenuForm frm = (MostrarTimeCampeonatoMenuForm) form;
		frm.inicializar(mapping, request);
		frm.setLogado(contaVO.getLogado());
		return mostrarCampeonato(mapping, form, request, response);
	}

//--------------------------------------------------------mostrarCampeonato--------------------------------------------------------------------

	public ActionForward mostrarCampeonato(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		MostrarTimeCampeonatoMenuForm frm = (MostrarTimeCampeonatoMenuForm) form;
		ActionErrors errors = new ActionErrors();
		frm.reset(mapping, request);
		int seqContaAnt = 0;
		Collection listaContaSeq = new ArrayList();
		Collection listaConta = new ArrayList();
		Collection listaCampeonato = new ArrayList();
		Collection listaCampeonatoCompleta = EstagioServices.getCampeonatoBean().getListaCampeonatos();
		Iterator iteratorCampeonatoCompleta = listaCampeonatoCompleta.iterator();
		while(iteratorCampeonatoCompleta.hasNext()){
			CampeonatoVO campeonatoVO = (CampeonatoVO) iteratorCampeonatoCompleta.next();
			if(campeonatoVO.getSeqConta()!=seqContaAnt){
				listaContaSeq.add(campeonatoVO.getSeqConta());
			}
			seqContaAnt = campeonatoVO.getSeqConta();
		}	
		if(listaCampeonatoCompleta.isEmpty()){
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.listaCampeonatoCompleta.vazia"));
			saveErrors(request, errors);
		}
		Iterator iteratorConta = listaContaSeq.iterator();
		while(iteratorConta.hasNext()){
			Integer seqConta = (Integer) iteratorConta.next();
			ContaVO contaVO = EstagioServices.getCampeonatoBean().getConta(seqConta);
			Iterator iteratorCampeonato = listaCampeonatoCompleta.iterator();
			while(iteratorCampeonato.hasNext()){
				CampeonatoVO campeonatoVO = (CampeonatoVO) iteratorCampeonato.next();
				if(seqConta.equals(campeonatoVO.getSeqConta())){
					listaCampeonato.add(campeonatoVO);
				}
				contaVO.setListaCampeonato(listaCampeonato);
			}
			listaConta.add(contaVO);
			listaCampeonato = new ArrayList();
		}
		frm.setListaConta(listaConta);
		ContaVO contaVO = (ContaVO) request.getSession().getAttribute("contaVO");
		frm.setContaVO(contaVO);
		return enviarPag(mapping, form, request, response);
	}

	public ActionForward buscar(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		MostrarTimeCampeonatoMenuForm frm = (MostrarTimeCampeonatoMenuForm) form;
		ActionErrors errors = new ActionErrors();
		if(("".equals(frm.getBuscarAdministrador())&& "".equals(frm.getBuscarCampeonato()))||(frm.getBuscarAdministrador()==null && frm.getBuscarCampeonato()==null)){
			return mostrarCampeonato(mapping, form, request, response);
		}
		Collection listaPesquisa = EstagioServices.getCampeonatoBean().buscaContaCampeonato(frm.getBuscarAdministrador(), frm.getBuscarCampeonato());
		if(frm.getListaConta().isEmpty()){
			errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("errors.listaCampeonatoCompleta.vazia"));
			saveErrors(request, errors);
		}
		int contAnt = 0;
		Collection listaFinalPesquisa = new ArrayList();
		Iterator iteratorListaPesquisa = listaPesquisa.iterator();
		while(iteratorListaPesquisa.hasNext()){
			ContaVO contaVO = (ContaVO) iteratorListaPesquisa.next();
			if (!contaVO.getSeqConta().equals(contAnt)){
			Iterator iteratorListaPesquisa2 = listaPesquisa.iterator();
			while(iteratorListaPesquisa2.hasNext()){
				ContaVO contaVO2 = (ContaVO) iteratorListaPesquisa2.next();
				if (!contaVO.getSeqConta().equals(contAnt)){
					listaFinalPesquisa.add(contaVO);
				}else{
					Collection listaIterator = new ArrayList();
					Iterator iteratorContaVO2Campeonato = contaVO2.getListaCampeonato().iterator();
					while(iteratorContaVO2Campeonato.hasNext()){
						CampeonatoVO campeonatoVO = (CampeonatoVO) iteratorContaVO2Campeonato.next();
						contaVO.getListaCampeonato().add(campeonatoVO);
					}
				}
				contAnt = contaVO.getSeqConta();
				}
			}
		}
		frm.setListaConta(listaFinalPesquisa);
		return enviarPag(mapping, form, request, response);
	}
	
	public ActionForward enviarPag(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		MostrarTimeCampeonatoMenuForm frm = (MostrarTimeCampeonatoMenuForm) form;
		frm.setBuscarAdministrador(new String());
		frm.setBuscarCampeonato(new String());
		return mapping.findForward("mostrarCampeonato");
	}

//-------------------------------------------------------------mostrarTabela/Resultado----------------------------------------------------------------------------------------------------------------	
	
	public ActionForward enviarTabela(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		MostrarTimeCampeonatoMenuForm frm = (MostrarTimeCampeonatoMenuForm) form;
		frm.setSeqCampeonato(new Integer(request.getParameter("seqCampeonato")));
		Collection listaTimesCampeonato = EstagioServices.getCampeonatoBean().listaTimesCampeonato(frm.getSeqCampeonato());
		Collection listaTimesCampeonatoFinal = new ArrayList();
		
		Comparator comparador2 = new Comparator(){
			public int compare(Object t1, Object t2){  
				TimesVO timesVO = (TimesVO) t1; 
				TimesVO timesVO2 = (TimesVO) t2;
				int comparacao = timesVO.getSeqTime().compareTo(timesVO2.getSeqTime());
				return comparacao;
			}
		};
		Collections.sort((List)listaTimesCampeonato, comparador2);
		
		Iterator iteratorListaTimesCampeonato = listaTimesCampeonato.iterator();
		int seqAnterior = 0; 
		while(iteratorListaTimesCampeonato.hasNext()){
			TimesVO timesVO = (TimesVO) iteratorListaTimesCampeonato.next();
			if (!timesVO.getSeqTime().equals(seqAnterior)){
				listaTimesCampeonatoFinal.add(timesVO);
			}
			seqAnterior = timesVO.getSeqTime();
		}
		frm.setListaTimesCampeonato(listaTimesCampeonatoFinal);
		Collection listaResultado = EstagioServices.getCampeonatoBean().getListaJogos(frm.getSeqCampeonato());
		frm.setListaResultado(listaResultado);
		Comparator comparador = new Comparator(){
			public int compare(Object t1, Object t2){  
				TimesVO timesVO = (TimesVO) t1; 
				TimesVO timesVO2 = (TimesVO) t2;
				int comparacaoJogos = timesVO.getTimePonto().compareTo(timesVO2.getTimePonto());
				if (comparacaoJogos == 0){
					int comparacaoVitoria = timesVO.getTimeVitoria().compareTo(timesVO2.getTimeVitoria());
					if(comparacaoVitoria == 0){
						int comparacaoSaldoGol = timesVO.getSaldoGol().compareTo(timesVO2.getSaldoGol());
						if(comparacaoSaldoGol == 0){
							int comparacaoGolPro = timesVO.getGolPro().compareTo(timesVO2.getGolPro());
							if(comparacaoGolPro == 0){
								int comparacaoEmpate = timesVO.getTimeEmpate().compareTo(timesVO2.getTimeEmpate());
								if(comparacaoEmpate == 0){
									int comparacaoNome = timesVO2.getNomeTime().compareTo(timesVO.getNomeTime());
									return comparacaoNome;
								}
								return comparacaoEmpate;
							}
							return comparacaoGolPro;
						}
						return comparacaoSaldoGol;
					}
					return comparacaoVitoria;
				}
				return comparacaoJogos;  
			}
		};
		Collections.sort((List)frm.getListaTimesCampeonato(), comparador);
		Collections.reverse((List)frm.getListaTimesCampeonato());
		return mapping.findForward("mostrarTabela");
	}
	
	public ActionForward enviarResultado(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		MostrarTimeCampeonatoMenuForm frm = (MostrarTimeCampeonatoMenuForm) form;
		frm.setSeqCampeonato(new Integer(request.getParameter("seqCampeonato")));
		frm.setListaResultado(EstagioServices.getCampeonatoBean().getListaJogos(frm.getSeqCampeonato()));
		Iterator iteratorListaResultado = frm.getListaResultado().iterator();
		while(iteratorListaResultado.hasNext()){
			JogosVO jogosVO = (JogosVO) iteratorListaResultado.next();
			if(jogosVO.getDataJogo()==null){
				jogosVO.setDataJogo("Indefinido");
			}
		}
		return mapping.findForward("mostrarResultado");
	}
	public ActionForward mostrarTime(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		GerenciarTimesForm frm = (GerenciarTimesForm)form;
		ActionErrors errors = new ActionErrors();
		Collection listaTimes = new ArrayList();
		
		if(listaTimes.isEmpty()){
			errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("vazia.lista.time"));
			saveErrors(request, errors);
			return mapping.findForward("manutencaoTime");
		}else{
			saveErrors(request, errors);
			return mostrarTime(mapping, form, request, response);
		}
	}

}